package com.mayfool.gitmanager.ui;

import com.mayfool.gitmanager.core.entity.ProjectInfo;
import com.mayfool.gitmanager.core.entity.TaskInfo;

import javax.swing.*;
import java.awt.*;
import java.util.HashSet;
import java.util.List;

/**
 * @author zhou.xu
 * @description: 新建任务对话框
 * 用于创建新的任务，包含任务名称、工作空间、项目选择和开发分支等配置项
 * 采用网格布局排列各个输入组件
 * @since 2025/3/10 21:44
 */
public class NewTaskDialog extends JPanel {

    /**
     * 任务名称输入框
     */
    private final JTextField taskNameField;

    /**
     * 工作空间选择器
     */
    private final DirChooser workspaceChooser;

    /**
     * 项目选择器
     */
    private final ProjectChooser projectChooser;

    /**
     * 开发分支名称输入框
     */
    private final JTextField branchField;

    /**
     * 构造函数
     * 初始化UI组件并设置布局
     */
    public NewTaskDialog() {
        // 使用4行2列的网格布局
        JPanel panel = new JPanel(new GridLayout(4, 2));
        
        // 初始化各个输入组件
        taskNameField = new JTextField("");
        workspaceChooser = new DirChooser("选择工作空间");
        projectChooser = new ProjectChooser("选择项目");
        branchField = new JTextField("develop");

        // 添加标签和输入组件到面板
        panel.add(new JLabel("任务名称:"));
        panel.add(taskNameField);
        panel.add(new JLabel("工作空间:"));
        panel.add(workspaceChooser);
        panel.add(new JLabel("选择项目:"));
        panel.add(projectChooser);
        panel.add(new JLabel("开发分支:"));
        panel.add(branchField);

        add(panel);
    }

    /**
     * 显示对话框并获取用户输入的任务信息
     * @param parent 父组件
     * @return 如果用户点击确定，返回新建的TaskInfo对象；如果取消则返回null
     */
    public TaskInfo showDialog(Component parent) {
        int result = JOptionPane.showConfirmDialog(parent, this, "新建任务",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        if (result == JOptionPane.OK_OPTION) {
            List<ProjectInfo> projects = projectChooser.getProjectInfos();
            return new TaskInfo(
                taskNameField.getText(),          // 任务名称
                workspaceChooser.getDir(),        // 工作空间路径
                new HashSet<>(projects),          // 项目列表
                branchField.getText()             // 开发分支名称
            );
        }
        return null;
    }
}
